<?php
class ProdutosController extends AppController {

  var $name = 'Produtos';
  var $layout = 'comprador';

  public $components = array('Paginator');
  public $helpers = array('Facebook.Facebook');

  public $paginate = array(
    'limit' => 2
  );

  var $permissao = array(
    '*' => array('listar', 'view', 'lista_ofertas', 'buscar', 'adquirir', 'ver_carrinho', 'remover_produto'),
    'admin' => array('admin_listar', 'admin_add', 'admin_edit', 'admin_delete')
  );

  function admin_listar() {
    $this->Paginator->settings = $this->paginate;
    $this->Paginator->settings['limit']  = 8;
    $this->Paginator->settings['order'] = array("Produto.created DESC");
    $data = $this->Paginator->paginate('Produto');

    $this->set('produtos', $data);
  }

  function admin_adicionaCor(){
    $this->autoRender = false;
    if($this->Produto->Cor->saveField('nm_cor', $this->data['nome'])){
      echo '<option value="'.$this->Produto->Cor->id.'">'.$this->data['nome'].'</value>';
    }
  }

  function admin_adicionaTamanho(){
    $this->autoRender = false;
    if($this->Produto->Tamanho->saveField('nm_tamanho', $this->data['nome'])){
      echo '<option value="'.$this->Produto->Tamanho->id.'">'.$this->data['nome'].'</value>';
    }
  }

  function listar() {
    $this->Paginator->settings = $this->paginate;
    $this->Paginator->settings['limit']  = 8;

    $this->Paginator->settings['conditions'] = $conditions = array();
    if(array_key_exists('tipo', $this->params['named'])){
      $conditions = array('tipo_id' => $this->params['named']['tipo']);
      $this->Paginator->settings['conditions'] = $conditions;
    }
    if(array_key_exists('categoria', $this->params['named'])){
      $conditions = array('Tipo.categoria_id' => $this->params['named']['categoria']);
      $this->Paginator->settings['conditions'] = $conditions;
    }

    if (!empty($this->data)) {
      $this->Paginator->settings['joins'] = array();
      if(isset($this->data['Produto']['cor'])){
        array_push($this->Paginator->settings['joins'],
        'LEFT JOIN cores_produtos AS CorProduto ON Produto.id = CorProduto.produto_id');
        array_push($this->Paginator->settings['conditions'],
        array('CorProduto.cor_id' => $this->data['Produto']['cor']));
      }
      if(isset($this->data['Produto']['tamanho'])){
        array_push($this->Paginator->settings['joins'],
        'LEFT JOIN produtos_tamanhos AS TamanhoProduto ON Produto.id = TamanhoProduto.produto_id');
        array_push($this->Paginator->settings['conditions'],
        array('TamanhoProduto.tamanho_id' => $this->data['Produto']['tamanho']));
      }
      if(!empty($this->data['Produto']['minimo'])){
        array_push($this->Paginator->settings['conditions'],
        array('Produto.preco >=' => $this->data['Produto']['minimo']));
      }
      if(!empty($this->data['Produto']['maximo'])){
        array_push($this->Paginator->settings['conditions'],
        array('Produto.preco <=' => $this->data['Produto']['maximo']));
      }
    }
    $data = $this->Paginator->paginate('Produto');

    $this->set('produtos', $data);
    $this->set('cores', $this->Produto->getCores($conditions));
    $this->set('tamanhos', $this->Produto->getTamanhos($conditions));
  }

  function view($id = null) {
    $this->Produto->id = $id;
    $produto = $this->Produto->read();
    if (!$produto) {
      throw new NotFoundException('Não foi possível encontrar o produto especificado');
    }
    $this->Produto->updateViews($id);
    $produto = $this->Produto->getPrecoFinal($produto, 1);
    $this->set('produto', $produto);//debug($produto);
    $this->set('cores', $this->Produto->getCoresPorProduto($produto));
    $this->set('tamanhos', $this->Produto->getTamanhoPorProduto($produto));
    $this->setTitle($produto['Produto']['nome']);

    $this->set('novidades', $this->Produto->getProdutosRelacionados($id));
    $this->loadModel('Banner');
    $this->set('banner', $this->Banner->find('first', array('conditions' => array('categoria' => 1))));
  }

  function admin_add() {
    if (!empty($this->data)) {
      if ($this->Produto->save($this->data)) {
        $this->Session->setFlash('Produto salvo com sucesso.');
        $this->redirect(array('admin' => true,'controller' => 'produtos', 'action' => 'listar'));
      }
    }

    $tipos = $this->Produto->Tipo->find('list', array('fields' => array('id', 'nome'), 'conditions' => array('ativo' => 1)));
    $fornecedores = $this->Produto->Fornecedor->find('list', array('fields' => array('id', 'nome')));
    $cores = $this->Produto->Cor->find('list', array('fields' => array('id', 'nm_cor'), 'conditions' => array('ativo' => 1)));
    $tamanhos = $this->Produto->Tamanho->find('list', array('fields' => array('id', 'nm_tamanho'), 'conditions' => array('ativo' => 1)));

    $this->set(compact('tipos', 'fornecedores', 'cores', 'tamanhos'));
  }

  function admin_delete($id) {
    $this->Produto->Desejo->deleteAll(array('produto_id' => $id));
    $this->Produto->Midia->deleteAll(array('produto_id' => $id), false, true);
    $this->Produto->delete($id);
    $this->Session->setFlash('O produto foi apagado com sucesso', "sucesso");
    $this->redirect(array('controller' => 'produtos', 'action'=>'listar', 'admin' => true));
  }

  function admin_edit($id) {
    $this->Produto->id = $id;

    if (empty($this->data)) {
      $this->data = $this->Produto->read();
    } else {
      if ($this->Produto->save($this->data)) {
        $this->Session->setFlash('Produto alterado com sucesso.');
        $this->redirect(array('admin' => true,'controller' => 'produtos', 'action' => 'listar'));
      }
    }

    $tipos = $this->Produto->Tipo->find('list', array('fields' => array('id', 'Tipo.nome', 'Categoria.nome'), 'conditions' => array('ativo' => 1), 'joins' => array(array(
            'table' => 'categorias',
            'alias' => 'Categoria',
            'type' => 'INNER',
            'conditions' => array(
                'Categoria.id = Tipo.categoria_id'
            )
        ))));
    $fornecedores = $this->Produto->Fornecedor->find('list', array('fields' => array('id', 'nome')));
    $cores = $this->Produto->Cor->find('list', array('fields' => array('id', 'nm_cor'), 'conditions' => array('ativo' => 1)));
    $tamanhos = $this->Produto->Tamanho->find('list', array('fields' => array('id', 'nm_tamanho'), 'conditions' => array('ativo' => 1)));

    $this->set(compact('tipos', 'fornecedores', 'cores', 'tamanhos'));
  }

  function lista_ofertas(){
    $this->Paginator->settings = $this->paginate;

    // similar to findAll(), but fetches paged results
    $data = $this->Paginator->paginate('Produto');

    $this->set('data', $data);
  }

  function buscar(){
    $this->Paginator->settings = $this->paginate;
    $this->Paginator->settings['limit'] = 4;
    $this->Paginator->settings['joins'] = array();

    if (empty($this->data)) {
      $termo = $this->params['named']['termo'];
      if(isset($this->params['named']['filtro']['cor'])) $cor = $this->params['named']['filtro']['cor'];
      if(isset($this->params['named']['filtro']['tamanho'])) $tamanho = $this->params['named']['filtro']['tamanho'];
      if(isset($this->params['named']['filtro']['minimo'])) $minimo = $this->params['named']['filtro']['minimo'];
      if(isset($this->params['named']['filtro']['maximo'])) $maximo = $this->params['named']['filtro']['maximo'];
    } else {
      $termo = $this->data['Produto']['busca'];
      if(isset($this->data['Produto']['cor'])) $cor = $this->data['Produto']['cor'];
      if(isset($this->data['Produto']['tamanho'])) $tamanho = $this->data['Produto']['tamanho'];
      if(isset($this->data['Produto']['minimo'])) $minimo = $this->data['Produto']['minimo'];
      if(isset($this->data['Produto']['maximo'])) $maximo = $this->data['Produto']['maximo'];
    }

    $this->Paginator->settings['conditions'] = array('Produto.nome LIKE' => '%'.$termo.'%');
    if(!empty($cor)){
      array_push($this->Paginator->settings['joins'],
      'LEFT JOIN cores_produtos AS CorProduto ON Produto.id = CorProduto.produto_id');
      array_push($this->Paginator->settings['conditions'],
      array('CorProduto.cor_id' => $cor));
    }
    if(!empty($tamanho)){ //arrumar depois
      array_push($this->Paginator->settings['joins'],
      'LEFT JOIN produtos_tamanhos AS TamanhoProduto ON Produto.id = TamanhoProduto.produto_id');
      array_push($this->Paginator->settings['conditions'],
      array('TamanhoProduto.tamanho_id' => $tamanho));
    }
    if(!empty($minimo)){
      array_push($this->Paginator->settings['conditions'],
      array('Produto.preco >=' => $minimo));
    }
    if(!empty($maximo)){
      array_push($this->Paginator->settings['conditions'],
      array('Produto.preco <=' => $maximo));
    }

    $data = $this->Paginator->paginate('Produto');
    if(count($data)){
      $this->Session->setFlash('Sua busca retornou resultados!','sucesso');
    } else{
      $this->Session->setFlash('Sua busca não retornou resultados!','erro');
    }

    $this->set('produtos', $data);
    $this->set('termo', $termo);
    $this->set('cores', $this->Produto->getCoresPorBusca($termo));
    $this->set('tamanhos', $this->Produto->getTamanhosPorBusca($termo));
  }

  function adquirir($produto_id = null){
    //debug($this->data);exit;
    if(!isset($this->data) && !isset($produto_id)){ return; }

    $produto_id = ($produto_id) ? $produto_id : $this->data['Produto']['produto_id'];
    $qtd_produtos = $this->data['Produto']['quantidade'];
    $produtos_adquiridos = $this->Session->read('Carrinho.produtos');

    if(!is_array($produtos_adquiridos)){ $produtos_adquiridos = array(); }
    if(!isset($produtos_adquiridos[$produto_id])){ $produtos_adquiridos[$produto_id] = array(); }

    if(!$this->existeProduto($produtos_adquiridos[$produto_id], $this->data['Produto'])){
      $produtos_adquiridos[$produto_id][] = array(
        'quantidade' => $this->data['Produto']['quantidade'],
        'tamanho_id' => $this->data['Produto']['tamanho_id'],
        'cor_id' => $this->data['Produto']['cor_id']);

        $this->Session->write('Carrinho.produtos', $produtos_adquiridos);
      }

      $this->redirect(array('controller' => 'produtos', 'action' => 'ver_carrinho'));
    }

    function remover_produto($produto_id, $cor_id, $tamanho_id){
      $produtos = $this->Session->read('Carrinho.produtos.'.$produto_id);
      $produto = $this->existeProduto($produtos, array('cor_id' => $cor_id, 'tamanho_id' => $tamanho_id));
      $key = array_search($produto, $produtos);
      array_splice($produtos, $key, 1);

      $retorno = $this->Session->write('Carrinho.produtos.'.$produto_id, $produtos);

      if(count($produtos) == 0){ $this->Session->delete('Carrinho.produtos.'.$produto_id); }

      if($retorno){
        $this->Session->setFlash('Produto removido!','sucesso');
      } else{
        $this->Session->setFlash('Erro ao remover produto!','erro');
      }
      $this->redirect(array('controller' => 'produtos', 'action' => 'ver_carrinho'));
    }

    function existeProduto($produtos, $produto){
      $retorno = false;
      foreach($produtos as $p){
        if($p['cor_id'] == $produto['cor_id'] && $p['tamanho_id'] == $produto['tamanho_id']){
          $retorno = $p;
        }
      }
      return $retorno;
    }

    function ver_carrinho(){
      $carrinho = $this->Session->read('Carrinho.produtos');
      $produtos = array();

      if(isset($carrinho)){
        $arrayOfIds = array_keys($carrinho);
        $produtos = $this->Produto->find('all', array(
          'fields' => array('Produto.nome', 'Produto.preco', 'Produto.id', 'Produto.qtd_estoque'),
          'conditions' => array('Produto.id' => $arrayOfIds, 'Produto.qtd_estoque > 0')
        ));

        foreach($produtos as $k => $v){
          foreach($carrinho[$produtos[$k]['Produto']['id']] as $produto){
            $produtos[$k] = $this->Produto->getPrecoFinal($produtos[$k], $produto['quantidade']);
          }
        }
      }

      $this->set('produtos',$produtos);
      $this->set('carrinho',$carrinho);
      $this->set('cores', $this->Produto->Cor->find('list', array('fields' => array('id', 'nm_cor'))));
      $this->set('tamanhos', $this->Produto->Tamanho->find('list', array('fields' => array('id', 'nm_tamanho'))));
      $this->setTitle('Carrinho');
    }

    function listar_ofertas($oferta_id){
      $this->listar();

      if(empty($this->Paginator->settings['joins'])) $this->Paginator->settings['joins'] = array();
      if(empty($this->Paginator->settings['conditions'])) $this->Paginator->settings['conditions'] = array();

      array_push($this->Paginator->settings['joins'],
        'LEFT JOIN ofertas_produtos AS OfertaProduto ON Produto.id = OfertaProduto.produto_id');
      array_push($this->Paginator->settings['conditions'],
        array('OfertaProduto.oferta_id' => $oferta_id));

      $this->set('produtos', $this->Paginator->paginate('Produto'));
    }

  }
?>
